﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESAN.Componentes.DACoreESAN.Models;
using System.Data.Common;
using System.Data;

namespace ESAN.Componentes.DACoreESAN.Logic.Facade
{
    public class DAPostulante
    {


        /// <summary>
        /// Se registra el código de honor del postulante
        /// </summary>
        /// <param name="idPostulante">ID del postulante</param>
        /// <param name="EsActivo">Valor indicando el estado del código de honor</param>
        /// <returns>Valor indicando el éxito o fracaso del registro</returns>
        static public bool RegistrarCodigoHonor(int idPostulante, bool EsActivo)
        {
            bool exito = true;

            try
            {
                using (var data = new InscripcionDataContext())
                {
                    IN_POSTULANTE postulante = new IN_POSTULANTE();

                    postulante = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante);
                    postulante.Post_CodigoHonor = EsActivo;
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;

            }


            return exito;
        }

        /// <summary>
        /// Obtener Codigo de Honor
        /// </summary>
        /// <param name="ID">ID del Postulante</param>
        /// <returns></returns>
        public static bool ObtenerCodigoHonor(int idPostulante)
        {
            bool estado = false;
            using (var data = new InscripcionDataContext())
            {
                IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                if (postulante.Post_CodigoHonor == null)
                {
                    estado = false;
                }
            }

            return estado;
        }


        /// <summary>
        /// Se registra la postulación
        /// </summary>
        /// <param name="postulacion">Objeto del tipo Posutlante</param>
        /// <param name="cliente">Objeto del tipo Cliente</param>
        /// <returns>Valor indicando si fue exitosa la transacción</returns>
        static public bool RegistrarPostulacion(int idConvocatoria, IN_CLIENTE cliente)
        {
            bool exito = true;

            using (var data = new InscripcionDataContext())
            {
                data.Connection.Open();
                // Instancia un objeto transacción que será asignado al contexto de datos
                using (DbTransaction transaccion = data.Connection.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    // Establece la transacción al a propiedad del contexto de datos.
                    data.Transaction = transaccion;
                    try
                    {
                        //Se debe validar si existe el cliente

                        //Se debe regitrar o actualizar la información del cliente
                        data.IN_CLIENTE.InsertOnSubmit(cliente);
                        data.SubmitChanges();

                        IN_POSTULANTE postulante = new IN_POSTULANTE();
                        postulante.Clie_ID = cliente.Clie_ID;
                        postulante.Conv_Id = idConvocatoria;
                        postulante.Fec_Creacion = DateTime.Now;
                        postulante.Post_Estado = "VEN001A";

                        //Se debe registrar el postulante
                        data.IN_POSTULANTE.InsertOnSubmit(postulante);

                        data.SubmitChanges();
                        transaccion.Commit();

                    }
                    catch
                    {
                        transaccion.Rollback();
                        exito = false;
                    }
                }
            }
            return exito;
        }

        public static List<IN_CONSULTA_ASPIRANTE> ConsultarAspirante(int idConvocatoria, string estado)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.ConsultarAspirante(idConvocatoria, estado).ToList();
            }
        }


        public static List<IN_CONSULTA_ASPIRANTEENTREVISTAPERSONAL> ConsultarAspiranteEntrevistaPersonal(int idConvocatoria)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.ConsultarAspiranteEntrevistaPersonal(idConvocatoria).ToList();
            }
        }

        public static bool PosponerPostulacion(int idPostulante, int idConvocatoria, string motivo)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    postulante.Conv_Id = idConvocatoria;
                    postulante.Post_MensajeObservacion = motivo;
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;

        }

        public static bool RechazarPostulacion(int idPostulante, string motivo)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    //postulante.Conv_Id = idConvocatoria;
                    postulante.Post_MensajeObservacion = motivo;
                    postulante.Post_Estado = "VEN001R";
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;

        }

        public static bool EliminarPostulacion(int idPostulante, string motivo, string estado)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    //postulante.Conv_Id = idConvocatoria;
                    postulante.Post_MensajeObservacion = motivo;
                    postulante.Post_Estado = estado;
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;

        }

        public static bool ProgramarEntrevistaPersonal(IN_PROGRAMACION_PROFESOR_SESION programacion)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {

                    data.IN_PROGRAMACION_PROFESOR_SESION.InsertOnSubmit(programacion);
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;

        }

        public static List<IN_PROGRAMACION_PROFESOR> ListadoProgramacionProfesor(int idConvocatoria)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_PROGRAMACION_PROFESOR.Where(x => x.Conv_ID == idConvocatoria).ToList();
            }

        }


        public static IN_PROGRAMACION_PROFESOR ObtenerProgramacionProfesor(int idConvocatoria, string usuario)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_PROGRAMACION_PROFESOR.Where(x => x.Conv_ID == idConvocatoria && x.Usuario.Equals(usuario)).FirstOrDefault();
            }

        }

        public static IN_PROGRAMACION_PROFESOR ObtenerProgramacionProfesor(int idProgramacionProfesor)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_PROGRAMACION_PROFESOR.Where(x => x.Id == idProgramacionProfesor).FirstOrDefault();
            }

        }

        public static IN_PROGRAMACION_PROFESOR_SESION ObtenerProgramacionProfesorSesion(int idProgramacionProfesor, DateTime? hora)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_PROGRAMACION_PROFESOR_SESION.Where(x => x.IdProgramacionProfesor == idProgramacionProfesor
                                                                  && x.HoraInicio.Hour == hora.Value.Hour
                                                                  && x.HoraInicio.Minute == hora.Value.Minute).FirstOrDefault();
            }

        }


        public static bool EliminarProgramacionProfesorSesion(int ID)
        {
            bool exito = true;
            using (var data = new InscripcionDataContext())
            {
                try
                {
                    List<IN_PROGRAMACION_PROFESOR_SESION> listado = data.IN_PROGRAMACION_PROFESOR_SESION.Where(x => x.IdProgramacionProfesor == ID).ToList();
                    data.IN_PROGRAMACION_PROFESOR_SESION.DeleteAllOnSubmit(listado);
                    data.SubmitChanges();
                }
                catch
                {
                    exito = false;
                }

                return exito;

            }
        }

        public static bool AprobarPostulante(int idPostulante, string nuevoEstado)
        {
            bool exito = true;
            using (var data = new InscripcionDataContext())
            {
                try
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    postulante.Post_Estado = nuevoEstado;
                    data.SubmitChanges();
                }
                catch
                {
                    exito = false;
                }

                return exito;

            }
        }

        public static bool RegistrarEntrevistaPersonal(int idPostulante, decimal puntaje, string comentario)
        {
            bool exito = true;
            using (var data = new InscripcionDataContext())
            {
                try
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    postulante.Post_FecExaPer = DateTime.Now;
                    postulante.Post_PtjeExaPer = puntaje;
                    postulante.Post_ObsExaPer = comentario;

                    data.SubmitChanges();
                }
                catch
                {
                    exito = false;
                }

                return exito;

            }
        
        
        }

        public static List<IN_CONSULTAASPIRANTENOTAADMISION> ConsultarAspiranteNotaAdmision(int idConvocatoria)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.ConsultarAspiranteNotaAdmision(idConvocatoria).ToList();
            }
        
        }

        public static bool RegistrarDescuento(int idPostulante, int idTipoDcto, string motivo)
        {
            bool exito = true;
            using (var data = new InscripcionDataContext())
            {
                try
                {
                    IN_POSTULANTE postulante = data.IN_POSTULANTE.Where(x => x.Post_ID == idPostulante).FirstOrDefault();
                    postulante.Post_TipoDescuento = idTipoDcto;
                    postulante.Post_MotivoDescuento = motivo;
                    data.SubmitChanges();
                }
                catch
                {
                    exito = false;
                }

                return exito;

            }
        }

    }
}
